package com.hnjowe.util;

import java.util.Random;

import org.apache.commons.id.Hex;

/**
 * @随机数字符串工具类
 * @projectname：cocotour
 * @packagename：com.hnjowe.util
 * @filename：RandomUtils.java
 * @date：2011-4-29 上午12:45:08
 * @author: wangxiuwu
 */
public class RandomUtils {
	
	//数字+小写字母+大写字母
	public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
	//小写字母+大写字母
    public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    //小写字母
    public static final String lowerCaseletterChar = "abcdefghijklmnopqrstuvwxyz";
    
    //数字+小写字母
    public static final String numberLetterChar = "0123456789abcdefghijklmnopqrstuvwxyz";
    
    //纯数字
    public static final String numberChar = "0123456789"; 


	public RandomUtils() {
	}
	
    /**
     * 生成32位的随机数,不 重复
	 * @return String 
	 */
    public static String getRandomCode32(){
    	return new String(Hex.encodeHex(org.apache.commons.id.uuid.UUID.randomUUID().getRawBytes()));
	}
	
	/** 
     * 随机生成一个定长字符串: 大写字母+小写字母+数字
     * @param length 随机字符串长度 
     * @return 随机字符串 
     */ 
    public static String generateString(int length) { 
    	StringBuffer sb = new StringBuffer(); 
        Random random = new Random(); 
        for (int i = 0; i < length; i++) { 
                sb.append(allChar.charAt(random.nextInt(allChar.length()))); 
        } 
        return sb.toString(); 
    } 

    /** 
     * 随机生成一个定长纯字母字符串: 大写字母+小写字母
     * @param length 随机字符串长度 
     * @return 随机字符串 
     */ 
    public static String generateMixString(int length) {
    	StringBuffer sb = new StringBuffer(); 
        Random random = new Random(); 
        for (int i = 0; i < length; i++) { 
                sb.append(letterChar.charAt(random.nextInt(letterChar.length()))); 
        } 
        return sb.toString(); 
    } 

    /** 
     * 随机生成一个定长纯字母字符串： 小写字母
     * @param length 随机字符串长度 
     * @return 随机字符串 
     */ 
    public static String generateLowerString(int length) { 
    	StringBuffer sb = new StringBuffer(); 
        Random random = new Random(); 
        for (int i = 0; i < length; i++) { 
                sb.append(lowerCaseletterChar.charAt(random.nextInt(lowerCaseletterChar.length()))); 
        } 
        return sb.toString(); 
    } 

    /** 
     * 随机生成一个定长纯字母字符串：大写字母
     * @param length 随机字符串长度 
     * @return 随机字符串 
     */ 
    public static String generateUpperString(int length) { 
    	StringBuffer sb = new StringBuffer(); 
        Random random = new Random(); 
        for (int i = 0; i < length; i++) { 
                sb.append(lowerCaseletterChar.charAt(random.nextInt(lowerCaseletterChar.length()))); 
        } 
        return sb.toString().toUpperCase();
    }
    
    /** 
     * 随机生成一个定长字母数字字符串：大写字母+数字
     * @param length 随机字符串长度 
     * @return 随机字符串 
     */ 
    public static String generateNumberUpperCaseString(int length) { 
    	StringBuffer sb = new StringBuffer(); 
        Random random = new Random(); 
        for (int i = 0; i < length; i++) { 
                sb.append(numberLetterChar.charAt(random.nextInt(numberLetterChar.length()))); 
        } 
        return sb.toString().toUpperCase();
    } 
    
    /** 
     * 随机生成一个定长字母数字字符串：小写字母+数字
     * @param length 随机字符串长度 
     * @return 随机字符串 
     */ 
    public static String generateNumberLowerCaseString(int length) { 
    	StringBuffer sb = new StringBuffer(); 
        Random random = new Random(); 
        for (int i = 0; i < length; i++) { 
                sb.append(numberLetterChar.charAt(random.nextInt(numberLetterChar.length()))); 
        } 
        return sb.toString();
    }

    /** 
     * 生成一个定长的纯0字符串 
     * @param length 字符串长度 
     * @return 纯0字符串 
     */ 
    public static String generateZeroString(int length) { 
            StringBuffer sb = new StringBuffer(); 
            for (int i = 0; i < length; i++) { 
                    sb.append('0'); 
            } 
            return sb.toString(); 
    } 

    /** 
     * 根据数字生成一个定长的字符串，长度不够前面补0 
     * @param num       数字 
     * @param fixdlenth 字符串长度 
     * @return 定长的字符串 
     */ 
    public static String toFixdLengthString(long num, int fixdlenth) { 
            StringBuffer sb = new StringBuffer(); 
            String strNum = String.valueOf(num); 
            if(fixdlenth - strNum.length() >= 0) { 
            	sb.append(generateZeroString(fixdlenth - strNum.length())); 
            }else { 
            	throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常！"); 
            } 
            sb.append(strNum); 
            return sb.toString(); 
    } 

    /** 
     * 根据数字生成一个定长的字符串，长度不够前面补0 
     * @param num             数字 
     * @param fixdlenth 字符串长度 
     * @return 定长的字符串 
     */ 
    public static String toFixdLengthString(int num, int fixdlenth) { 
            StringBuffer sb = new StringBuffer(); 
            String strNum = String.valueOf(num); 
            if (fixdlenth - strNum.length() >= 0) { 
                    sb.append(generateZeroString(fixdlenth - strNum.length())); 
            } else { 
                    throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常！"); 
            } 
            sb.append(strNum); 
            return sb.toString(); 
    } 

    public static void main(String[] args) { 

            System.out.println("大写字母+小写字母+数字:	" + generateString(15));
            System.out.println("大写字母+小写字母:     	" + generateMixString(15));
            System.out.println("小写字母:             	" + generateLowerString(15));
            System.out.println("大写字母:				" + generateUpperString(15));
            System.out.println("大写字母+数字:			" + generateNumberUpperCaseString(15));
            System.out.println("小写字母+数字:			" + generateNumberLowerCaseString(15));
            System.out.println("大写字母:				" + generateUpperString(15));

            System.out.println(generateZeroString(15)); 
            System.out.println(toFixdLengthString(123, 15)); 
            System.out.println(toFixdLengthString(123L, 15)); 
    } 

}
